"""
生产者与消费者：两个线程之间的通信

Python的queue模块中提供了同步的、线程安全的队列类, 包括FIFO(先进先出)列队Queue,
LIFO(后进先出)列队LifoQueue, 和优先级队列PriorityQueue, 这些队列都实现了锁原语
(可以理解为原子操作, 即要么不做, 要么就做完), 能够在多线程中直接使用.
可以使用列队来实现线程间的同步.
queue.Queue()
queue.LifoQueue()
queue.PriorityQueue()
"""

import threading
import queue
import random
import time


def produce(q):
    i = 0
    while i <= 4:
        num = random.randint(1, 100)
        q.put('生产者生产数据: %d' % num)
        print('生产者生产数据: %d' % num)
        time.sleep(1)
        i += 1
    q.put(None)
    # 完成任务
    q.task_done()


def consume(q):
    while True:
        item = q.get()
        if item is None:
            break
        print('消费者获取到: %s' % item)
        time.sleep(2)
    # 完成任务
    q.task_done()  # 不明白这段代码的意思


if __name__ == '__main__':
    q = queue.Queue(10)
    arr = []

    # 创建生产者
    th = threading.Thread(target=produce, args=(q,))
    th.start()

    # 创建消费者
    tc = threading.Thread(target=consume, args=(q,))
    tc.start()

    th.join()
    tc.join()
    print('END')
"""
生产者生产数据: 11
消费者获取到: 生产者生产数据: 11
生产者生产数据: 66
消费者获取到: 生产者生产数据: 66
生产者生产数据: 56
生产者生产数据: 76
消费者获取到: 生产者生产数据: 56
生产者生产数据: 71
消费者获取到: 生产者生产数据: 76
消费者获取到: 生产者生产数据: 71
END
"""
